package com.jsy.common.util.forest;

import com.dtflys.forest.annotation.BaseRequest;
import com.dtflys.forest.annotation.Body;
import com.dtflys.forest.annotation.DataFile;
import com.dtflys.forest.annotation.DecompressGzip;
import com.dtflys.forest.annotation.Get;
import com.dtflys.forest.annotation.HTTPProxy;
import com.dtflys.forest.annotation.Post;
import com.dtflys.forest.annotation.Request;
import com.dtflys.forest.annotation.Retry;
import com.dtflys.forest.annotation.Var;
import com.dtflys.forest.callback.OnProgress;
import com.dtflys.forest.extensions.DownloadFile;

import java.io.File;
import java.util.Map;

//@BaseRequest(baseURL = "${baseUrl}")
public interface MyClient {
    @Get("http://localhost:8080/hello")
    String helloForest();

    @Request(url = "http://localhost:8080/hello/{name}")
    String send(@Var("name") String name);

    /**
     * async 属性为 true 即为异步请求，为 false 则为同步请求
     * 不设置该属性时，默认为 false
     */
    @Get(
            url = "http://localhost:8080/hello/user?username=${0}",
            headers = "Accept: application/json",
            async = true
    )
    String asyncGet(String username);


    // 作为 Body 数据
    @Post(url = "http://localhost:8080/user", contentType="application/json")
    @Retry(maxRetryCount = "3", maxRetryInterval = "10")
    String submitUserInfo(@Body String myUser);


    /**
     * 用@DataFile注解修饰要上传的参数对象
     * OnProgress参数为监听上传进度的回调函数
     */
    @Post(url = "/upload")
    Map upload(@DataFile("file") String filePath, OnProgress onProgress);
    /**
     * 在方法上加上@DownloadFile注解
     * dir属性表示文件下载到哪个目录
     * filename属性表示文件下载成功后以什么名字保存，如果不填，这默认从URL中取得文件名
     * OnProgress参数为监听上传进度的回调函数
     */
    @Get(url = "http://localhost:8080/images/xxx.jpg")
    @DownloadFile(dir = "${0}", filename = "${1}")
    File downloadFile(String dir, String filename, OnProgress onProgress);

    /**
     * 为请求方法添加Gzip解压能力
     */
    @Get("/transaction")
    @DecompressGzip
    String transaction(String infno);

    /**
     * 使用 @HTTPProxy 注解设置代理服务器
     * host属性为代理服务器主机地址
     * port属性为代理服务器端口号
     */
    @Post( "http://localhost:8080/hello")
    @HTTPProxy(host = "127.0.0.1", port = "10801")
    String simplePostWithProxy();

    /**
     * 使用 @HTTPProxy 注解设置带密码验证的代理服务器
     * host属性为代理服务器主机地址
     * port属性为代理服务器端口号
     * username属性为代理服务验证的用户名
     * password属性为代理服务验证的密码
     */
    @Post("http://localhost:8080/hello")
    @HTTPProxy(host = "127.0.0.1", port = "10801", username = "root", password = "xxxxxx")
    String simplePostWithProxyAuth();



}
